package com.jxs.easysecurity.http;

import com.jxs.easysecurity.resource.http.UriResource;
import com.jxs.easysecurity.session.Session;
import com.jxs.easysecurity.session.SessionManager;
import com.jxs.easysecurity.token.AccessToken;

/**
 * URI资源验证服务。
 * @author jiangxingshang
 * @since 17/6/22
 */
public class HttpSecurityService {

    public enum ValidationResult {
        /**
         * 无验证，通常是没有找到匹配的保护资源，所以无法执行验证，这可能是一个非保护资源
         */
        IGNORE,
        /**
         * 找到匹配的保护资源，并且验证通过
         */
        SUCCESS,
        /**
         * 找到匹配的保护资源，验证不通过，用户没有登陆
         */
        NO_LOGIN,
        /**
         * 找到匹配的保护资源，验证不通过，权限不足
         */
        NO_PRIVILEGE,
        /**
         * 找到匹配的保护资源，但是访问凭证已失效
         */
        TOKEN_EXPIRE
    }

    private SessionManager sessionManager;

    public HttpSecurityService(SessionManager sessionManager) {
        this.sessionManager = sessionManager;
    }

    public ValidationResult validate(Session session, UriResource resource) {
        if(session.isLogin()) {
            sessionManager.updateSessionTimeout(session);
        }


        if(resource != null && !resource.ignore()) {
            if(session.isTokenExpire()) {
                return ValidationResult.TOKEN_EXPIRE;
            } else if(session.isLogin()) {
                if(session.hasResource(resource)) {
                    return ValidationResult.SUCCESS;
                } else {
                    return ValidationResult.NO_PRIVILEGE;
                }
            } else {
                return ValidationResult.NO_LOGIN;
            }
        } else {
            return ValidationResult.IGNORE;
        }
    }
}
